#!/bin/bash
# ///******************** NG.Respate(C)  **********************************
# //* 产品名称: mk-win.sh
# //* 程序作者: Respate
# //* 程序版本: V1.1														   
# //* 编制日期: 2020/7/18
# //* 功能描述: 主要用于指导 驱动与测试App编译与更新
# //* SPDX-License-Identifier:	GPL-2.0+
# //* QQ:	2085827949
# //**********************************************************************/

# mk脚本提示信息
X86_MK_INFO=" ^_^ (x86)this is shell for make module....... \n\
--By Respate(2019-9-11) \n\
QQ:2085827949"

export make_s=--no-print-directory # 静默编译,不打印文件夹

# 获取CP线程
MAX_THREAD=`grep 'processor' /proc/cpuinfo | sort -u | wc -l`
THREAD2=`expr $MAX_THREAD \* 2`
export THREAD2=${THREAD2}

#######################################################################################
#funtion:检查驱动目录
#######################################################################################
function check_drv_dir
{
    echo "get TAR_DRV_DIR:${TAR_DRV_DIR}"
    # 检查编译目标文件夹(源码目录)
    ! [ -d "$TAR_DRV_DIR" ] && TAR_DRV_DIR=$DRIVERS_DIR/$TAR_DRV_DIR
    ! [ -d "$TAR_DRV_DIR" ] && TAR_DRV_DIR=${DEF_DRV_DIR} && echo "compile The Def driver Folder:$DEF_DRV_DIR"  # 设置为默认文件夹
    ! [ -d "$TAR_DRV_DIR" ]	&& echo "Def err! exit now!" && exit # 再次检查编译目标文件夹(源码目录)
    # echo "Build in ${TAR_DRV_DIR}"

    # 导出到环境变量
    export TAR_DRV_DIR=${TAR_DRV_DIR}
}


#######################################################################################
#funtion:拷贝编译好的驱动文件到linux中
#######################################################################################
function update_module
{
	echo -e "\nCopy module to $WIN_NFS_DIR now ........"

    # 判断$WIN_NFS_DIR(nfs) 是否正确
    if [ -z "$WIN_NFS_DIR" ] || ! [[ -d "$WIN_NFS_DIR" || -f "$WIN_NFS_DIR" ]]; then
        echo "WIN_NFS_DIR err!"
        exit
    fi

    # 更新脚本到共享目录(nfs)
	# cp -f ${WORK_DIR}/mk        $WIN_NFS_DIR/mk
    # cp -f $(dirname "${BASH_SOURCE[0]}")/mk-arm.sh $WIN_NFS_DIR/mk-arm.sh
    
    if [ -f "${WORK_DIR}/test.sh" ];then
        cp -f ${WORK_DIR}/test.sh   $WIN_NFS_DIR   # 开发板平台下测试脚本
    fi 

    # 先删除共享目录下可执行文件
    # rm -f ${WIN_NFS_DIR}/*.o 
	# rm -f ${WIN_NFS_DIR}/*.ko


    # 拷贝可执行文件到共享目录下
	# cp -f ${BUILD_DIR}/*  $WIN_NFS_DIR
    timestamp=`date +%s`
    for name in `ls $BUILD_DIR`
    do
        ! [ -f ${BUILD_DIR}/$name ] && continue
        filetimestamp=`stat -c %Y $BUILD_DIR/$name`
        timecha=$(($timestamp - $filetimestamp))
        [ $timecha -gt 60 ] && continue
        echo "cp -f out/$BOAROD_CFG/$name $WIN_NFS_DIR/"
        cp -f ${BUILD_DIR}/$name $WIN_NFS_DIR/
    done
}

function clean_sub_directory
{
    echo
}

##############################################################################
# 文件清理
##############################################################################
function clean_module
{
	echo "$1 bin files ........"
    cleanDir=$TAR_DRV_DIR # 默认为目标驱动编译的文件
    rm -f .config

    case $1 in
    clean)      cleanDir=$TAR_DRV_DIR;; # 清除目标驱动编译的文件
    distclean)  cleanDir=${WORK_DIR};;  # 清除整个项目编译的文件
    *) echo "cmd err:$1" ; exit;;
    esac

    # 判断文件夹是否合理
    if [ -z $cleanDir ] || [ ! -d $cleanDir ] || [ "$cleanDir" = '/' ]; then
        echo "cleanDir err! not be $cleanDir"
        exit
    fi
    echo "cleanDir:$cleanDir"
    cd $cleanDir # 进入目标文件夹

    # 查找并 清理文件
	find $cleanDir \( -name '*.o' -o -name '*.ko' \) \
	-type f -print | xargs rm -f

}


#######################################################################################
# 编译模块
#######################################################################################
function build_module
{
	echo "Buid module now ........"

    # 判断$BUILD_DIR(可执行文件存放目录) 是否正确
    if [ -z "${BUILD_DIR}" ]; then
        echo "BUILD_DIR err! ${BUILD_DIR}"
        exit
    fi
    mkdir -p ${BUILD_DIR} # 创建临时存储文件夹


    # 编译目标驱动
	[ -f $TAR_DRV_DIR/all.mk ] && make ${make_s} -C $TAR_DRV_DIR -f all.mk  $*
    [ -f $TAR_DRV_DIR/lap.mk ] && make ${make_s} -C $TAR_DRV_DIR -f lap.mk  $*
}



#######################################################################################
## 安装交叉编译链 install_gcc_tools /home/.gcc/gcc-tools/GCC版本 GCC软连接
#######################################################################################
function install_gcc_tools
{

    TEMP_GCC=$1  # 更新数据
    # 获取软连接GCC下是否正确
    if [ -d "$1" ];then
        GGCV=$( ls $1 | grep "gcc-" )
        TEMP_GCC="$1/${GGCV%%gcc*}"   
    fi

    test -z ${TEMP_GCC} || return # 获取GCC 直接返回

    # 检测参数是否正确 判断是否手动安装gcc
    if [ $# -lt 2  ] || [ $NOT_CHEAK_GCC == "y" ]; then
        echo "install_gcc_tools  err!"
        exit
    fi

    # 需要重新配置GCC(创建软连接)
	User=${USER}
	GCC_DIR="/home/.gcc"
	GCC_NAME="gcc-tools"

	echo "install the toolchain now... "
	sudo mkdir -p ${GCC_DIR}			# 创建文件夹
	cd ${GCC_DIR} >> /dev/null			# 进入文件夹

	# 文件夹不存在 克隆工具链到本地
	if [[ ! -d "${GCC_DIR}/${GCC_NAME}" ]]; then
		git clone "https://gitee.com/respate/gcc-tools.git"
	fi
    sudo chmod 755 ${GCC_DIR}/${GCC_NAME} -R		# 设置为任何用户都有权限执行
	cd - >> /dev/null		#回到当前目录

	# 回到顶层文件夹，创建软连接
	rm -f $1    # 删除软连接
    tarGCC=$1
    echo "ln -s ${GCC_DIR}/${GCC_NAME}/$2 ${tarGCC%%/bin*}"
	ln -s ${GCC_DIR}/${GCC_NAME}/$2  ${tarGCC%%/bin*} # 创建软连接

    # 再次获取软连接GCC下是否正确
    if [ -d "$1" ];then
        GGCV=$( ls $1 | grep "gcc-" )
        TEMP_GCC="$1/${GGCV%%gcc*}"   
    fi
    if [ -z ${TEMP_GCC} ];then # 获取GCC 失败直接退出
        echo "gcc auto config err!"
        exit
    fi
}

#######################################################################################
## 检查交叉编译链
#######################################################################################
function check_gcc_tools
{
    # 安装 BSP GCC
    [ -f "${BSP_GCC_TOOL_NAME}gcc" ] && TEMP_GCC=${BSP_GCC_TOOL_NAME} # 获取GCC 
    [ -z "${TEMP_GCC}" ] && install_gcc_tools "${BSP_CROSS_COMPILE}/bin" ${BSP_GCC_TOOL_NAME};
    if [ -z ${TEMP_GCC} ]; then
        echo "GCC ERR:${TEMP_GCC}"; exit ;
    fi
    export BSP_CROSS_COMPILE=${TEMP_GCC}

    # 安装 APP GCC
    TEMP_GCC=
    if [ -z ${APP_CROSS_COMPILE} ] || [ ${APP_CROSS_COMPILE} == "gcc" ];then
        export APP_CROSS_COMPILE=""
        return;
    fi

    [ -f "${APP_GCC_TOOL_NAME}gcc" ] && TEMP_GCC=${APP_GCC_TOOL_NAME} # 获取GCC 
    [ -z "${TEMP_GCC}" ] && install_gcc_tools "${APP_CROSS_COMPILE}/bin" ${APP_GCC_TOOL_NAME};
    if [ -z ${TEMP_GCC} ]; then
        echo "GCC ERR:${TEMP_GCC}"; exit ;
    fi
    export APP_CROSS_COMPILE=${TEMP_GCC}
    export APP_CROSS_COMPILE_VERSION=$(${APP_CROSS_COMPILE}gcc -dumpversion)
}

#######################################################################################
## 创建kernel/include 软连接
#######################################################################################
function link_include
{
    # 检查 kernel/include 路径                  检查work/include 下是否存在文件
    if [ -d "${BOAROD_TOP_DIR}/include" ] && [ -z "$(ls "${BUILD_DIR}/inc" 2>/dev/null)" ];then
        ln -s ${BOAROD_TOP_DIR}/include ${BUILD_DIR}/inc  -f # 创建软连接
    fi

     # 检查 kernel/include 路径                  检查work/include 下是否存在文件
    if [ -d "${BOAROD_TOP_DIR}/arch/${ARCH}/include" ] && [ -z "$(ls "${BUILD_DIR}/include" 2>/dev/null)" ];then
        ln -s ${BOAROD_TOP_DIR}/arch/${ARCH}/include ${BUILD_DIR}/include -f # 创建软连接
    fi
}





#=======================================================================================
#==	x86 脚本开始执行
#=======================================================================================
echo -e ${X86_MK_INFO}
#cd $TAR_DRV_DIR


















